//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS Snowball service.
///
/// The Amazon Web Services Snow Family provides a petabyte-scale data transport solution that uses secure devices to transfer large amounts of data between your on-premises data centers and Amazon Simple Storage Service (Amazon S3). The Snow Family commands described here provide access to the same functionality that is available in the Amazon Web Services Snow Family Management Console, which enables you to create and manage jobs for a Snow Family device. To transfer data locally with a Snow Family device, you'll need to use the Snowball Edge client or the Amazon S3 API Interface for Snowball or OpsHub for Snow Family. For more information, see the User Guide.
public struct Snowball: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the Snowball client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "AWSIESnowballJobManagementService",
            serviceName: "Snowball",
            serviceIdentifier: "snowball",
            serviceProtocol: .json(version: "1.1"),
            apiVersion: "2016-06-30",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: SnowballErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.dualstack]: .init(endpoints: [
            "af-south-1": "snowball.af-south-1.api.aws",
            "ap-east-1": "snowball.ap-east-1.api.aws",
            "ap-northeast-1": "snowball.ap-northeast-1.api.aws",
            "ap-northeast-2": "snowball.ap-northeast-2.api.aws",
            "ap-northeast-3": "snowball.ap-northeast-3.api.aws",
            "ap-south-1": "snowball.ap-south-1.api.aws",
            "ap-southeast-1": "snowball.ap-southeast-1.api.aws",
            "ap-southeast-2": "snowball.ap-southeast-2.api.aws",
            "ap-southeast-3": "snowball.ap-southeast-3.api.aws",
            "ca-central-1": "snowball.ca-central-1.api.aws",
            "eu-central-1": "snowball.eu-central-1.api.aws",
            "eu-north-1": "snowball.eu-north-1.api.aws",
            "eu-south-1": "snowball.eu-south-1.api.aws",
            "eu-west-1": "snowball.eu-west-1.api.aws",
            "eu-west-2": "snowball.eu-west-2.api.aws",
            "eu-west-3": "snowball.eu-west-3.api.aws",
            "il-central-1": "snowball.il-central-1.api.aws",
            "me-central-1": "snowball.me-central-1.api.aws",
            "sa-east-1": "snowball.sa-east-1.api.aws",
            "us-east-1": "snowball.us-east-1.api.aws",
            "us-east-2": "snowball.us-east-2.api.aws",
            "us-gov-east-1": "snowball.us-gov-east-1.api.aws",
            "us-gov-west-1": "snowball.us-gov-west-1.api.aws",
            "us-west-1": "snowball.us-west-1.api.aws",
            "us-west-2": "snowball.us-west-2.api.aws"
        ]),
        [.dualstack, .fips]: .init(endpoints: [
            "af-south-1": "snowball-fips.af-south-1.api.aws",
            "ap-east-1": "snowball-fips.ap-east-1.api.aws",
            "ap-northeast-1": "snowball-fips.ap-northeast-1.api.aws",
            "ap-northeast-2": "snowball-fips.ap-northeast-2.api.aws",
            "ap-northeast-3": "snowball-fips.ap-northeast-3.api.aws",
            "ap-south-1": "snowball-fips.ap-south-1.api.aws",
            "ap-southeast-1": "snowball-fips.ap-southeast-1.api.aws",
            "ap-southeast-2": "snowball-fips.ap-southeast-2.api.aws",
            "ap-southeast-3": "snowball-fips.ap-southeast-3.api.aws",
            "ca-central-1": "snowball-fips.ca-central-1.api.aws",
            "eu-central-1": "snowball-fips.eu-central-1.api.aws",
            "eu-north-1": "snowball-fips.eu-north-1.api.aws",
            "eu-south-1": "snowball-fips.eu-south-1.api.aws",
            "eu-west-1": "snowball-fips.eu-west-1.api.aws",
            "eu-west-2": "snowball-fips.eu-west-2.api.aws",
            "eu-west-3": "snowball-fips.eu-west-3.api.aws",
            "il-central-1": "snowball-fips.il-central-1.api.aws",
            "me-central-1": "snowball-fips.me-central-1.api.aws",
            "sa-east-1": "snowball-fips.sa-east-1.api.aws",
            "us-east-1": "snowball-fips.us-east-1.api.aws",
            "us-east-2": "snowball-fips.us-east-2.api.aws",
            "us-gov-east-1": "snowball-fips.us-gov-east-1.api.aws",
            "us-gov-west-1": "snowball-fips.us-gov-west-1.api.aws",
            "us-west-1": "snowball-fips.us-west-1.api.aws",
            "us-west-2": "snowball-fips.us-west-2.api.aws"
        ]),
        [.fips]: .init(endpoints: [
            "af-south-1": "snowball-fips.af-south-1.amazonaws.com",
            "ap-east-1": "snowball-fips.ap-east-1.amazonaws.com",
            "ap-northeast-1": "snowball-fips.ap-northeast-1.amazonaws.com",
            "ap-northeast-2": "snowball-fips.ap-northeast-2.amazonaws.com",
            "ap-northeast-3": "snowball-fips.ap-northeast-3.amazonaws.com",
            "ap-south-1": "snowball-fips.ap-south-1.amazonaws.com",
            "ap-southeast-1": "snowball-fips.ap-southeast-1.amazonaws.com",
            "ap-southeast-2": "snowball-fips.ap-southeast-2.amazonaws.com",
            "ap-southeast-3": "snowball-fips.ap-southeast-3.amazonaws.com",
            "ca-central-1": "snowball-fips.ca-central-1.amazonaws.com",
            "cn-north-1": "snowball-fips.cn-north-1.amazonaws.com.cn",
            "cn-northwest-1": "snowball-fips.cn-northwest-1.amazonaws.com.cn",
            "eu-central-1": "snowball-fips.eu-central-1.amazonaws.com",
            "eu-north-1": "snowball-fips.eu-north-1.amazonaws.com",
            "eu-south-1": "snowball-fips.eu-south-1.amazonaws.com",
            "eu-west-1": "snowball-fips.eu-west-1.amazonaws.com",
            "eu-west-2": "snowball-fips.eu-west-2.amazonaws.com",
            "eu-west-3": "snowball-fips.eu-west-3.amazonaws.com",
            "il-central-1": "snowball-fips.il-central-1.amazonaws.com",
            "me-central-1": "snowball-fips.me-central-1.amazonaws.com",
            "sa-east-1": "snowball-fips.sa-east-1.amazonaws.com",
            "us-east-1": "snowball-fips.us-east-1.amazonaws.com",
            "us-east-2": "snowball-fips.us-east-2.amazonaws.com",
            "us-gov-east-1": "snowball-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "snowball-fips.us-gov-west-1.amazonaws.com",
            "us-west-1": "snowball-fips.us-west-1.amazonaws.com",
            "us-west-2": "snowball-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Cancels a cluster job. You can only cancel a cluster job while it's in the AwaitingQuorum status. You'll have at least an hour after creating a cluster job to cancel it.
    @Sendable
    @inlinable
    public func cancelCluster(_ input: CancelClusterRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CancelClusterResult {
        try await self.client.execute(
            operation: "CancelCluster", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Cancels a cluster job. You can only cancel a cluster job while it's in the AwaitingQuorum status. You'll have at least an hour after creating a cluster job to cancel it.
    ///
    /// Parameters:
    ///   - clusterId: The 39-character ID for the cluster that you want to cancel, for example CID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func cancelCluster(
        clusterId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CancelClusterResult {
        let input = CancelClusterRequest(
            clusterId: clusterId
        )
        return try await self.cancelCluster(input, logger: logger)
    }

    /// Cancels the specified job. You can only cancel a job before its JobState value changes to PreparingAppliance. Requesting the ListJobs or DescribeJob action returns a job's JobState as part of the response element data returned.
    @Sendable
    @inlinable
    public func cancelJob(_ input: CancelJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CancelJobResult {
        try await self.client.execute(
            operation: "CancelJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Cancels the specified job. You can only cancel a job before its JobState value changes to PreparingAppliance. Requesting the ListJobs or DescribeJob action returns a job's JobState as part of the response element data returned.
    ///
    /// Parameters:
    ///   - jobId: The 39-character job ID for the job that you want to cancel, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func cancelJob(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CancelJobResult {
        let input = CancelJobRequest(
            jobId: jobId
        )
        return try await self.cancelJob(input, logger: logger)
    }

    /// Creates an address for a Snow device to be shipped to. In most regions, addresses are validated at the time of creation. The address you provide must be located within the serviceable area of your region. If the address is invalid or unsupported, then an exception is thrown. If providing an address as a JSON file through the cli-input-json option, include the full file path. For example, --cli-input-json file://create-address.json.
    @Sendable
    @inlinable
    public func createAddress(_ input: CreateAddressRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAddressResult {
        try await self.client.execute(
            operation: "CreateAddress", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an address for a Snow device to be shipped to. In most regions, addresses are validated at the time of creation. The address you provide must be located within the serviceable area of your region. If the address is invalid or unsupported, then an exception is thrown. If providing an address as a JSON file through the cli-input-json option, include the full file path. For example, --cli-input-json file://create-address.json.
    ///
    /// Parameters:
    ///   - address: The address that you want the Snow device shipped to.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAddress(
        address: Address,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAddressResult {
        let input = CreateAddressRequest(
            address: address
        )
        return try await self.createAddress(input, logger: logger)
    }

    /// Creates an empty cluster. Each cluster supports five nodes. You use the CreateJob action separately to create the jobs for each of these nodes. The cluster does not ship until these five node jobs have been created.
    @Sendable
    @inlinable
    public func createCluster(_ input: CreateClusterRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateClusterResult {
        try await self.client.execute(
            operation: "CreateCluster", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an empty cluster. Each cluster supports five nodes. You use the CreateJob action separately to create the jobs for each of these nodes. The cluster does not ship until these five node jobs have been created.
    ///
    /// Parameters:
    ///   - addressId: The ID for the address that you want the cluster shipped to.
    ///   - description: An optional description of this specific cluster, for example Environmental Data Cluster-01.
    ///   - forceCreateJobs: Force to create cluster when user attempts to overprovision or underprovision a cluster. A cluster is overprovisioned or underprovisioned if the initial size of the cluster is more (overprovisioned) or less (underprovisioned) than what  needed to meet capacity requirement specified with OnDeviceServiceConfiguration.
    ///   - forwardingAddressId: The forwarding address ID for a cluster. This field is not supported in most regions.
    ///   - initialClusterSize: If provided, each job will be automatically created and associated with the new cluster. If not provided, will be treated as 0.
    ///   - jobType: The type of job for this cluster. Currently, the only job type supported for clusters is LOCAL_USE. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - kmsKeyARN: The KmsKeyARN value that you want to associate with this cluster. KmsKeyARN values are created by using the CreateKey API action in Key Management Service (KMS).
    ///   - longTermPricingIds: Lists long-term pricing id that will be used to associate with jobs automatically created for the new cluster.
    ///   - notification: The Amazon Simple Notification Service (Amazon SNS) notification settings for this cluster.
    ///   - onDeviceServiceConfiguration: Specifies the service or services on the Snow Family device that your transferred data will be exported from or imported into. Amazon Web Services Snow Family device clusters support Amazon S3 and NFS (Network File System).
    ///   - remoteManagement: Allows you to securely operate and manage Snow devices in a cluster remotely from outside of your internal network. When set to INSTALLED_AUTOSTART, remote management will automatically be available when the device arrives at your location. Otherwise, you need to use the Snowball Client to manage the device.
    ///   - resources: The resources associated with the cluster job. These resources include Amazon S3 buckets and optional Lambda functions written in the Python language.
    ///   - roleARN: The RoleARN that you want to associate with this cluster. RoleArn values are created by using the CreateRole API action in Identity and Access Management (IAM).
    ///   - shippingOption: The shipping speed for each node in this cluster. This speed doesn't dictate how soon you'll get each Snowball Edge device, rather it represents how quickly each device moves to its destination while in transit. Regional shipping speeds are as follows:    In Australia, you have access to express shipping. Typically, Snow devices shipped express are delivered in about a day.   In the European Union (EU), you have access to express shipping. Typically, Snow devices shipped express are delivered in about a day. In addition, most countries in the EU have access to standard shipping, which typically takes less than a week, one way.   In India, Snow devices are delivered in one to seven days.   In the United States of America (US), you have access to one-day shipping and two-day shipping.     In Australia, you have access to express shipping. Typically, devices shipped express are delivered in about a day.   In the European Union (EU), you have access to express shipping. Typically, Snow devices shipped express are delivered in about a day. In addition, most countries in the EU have access to standard shipping, which typically takes less than a week, one way.   In India, Snow devices are delivered in one to seven days.   In the US, you have access to one-day shipping and two-day shipping.
    ///   - snowballCapacityPreference: If your job is being created in one of the US regions, you have the option of specifying what size Snow device you'd like for this job. In all other regions, Snowballs come with 80 TB in storage capacity. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - snowballType: The type of Snow Family devices to use for this cluster.   For cluster jobs, Amazon Web Services Snow Family currently supports only the EDGE device type.  For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - taxDocuments: The tax documents required in your Amazon Web Services Region.
    ///   - logger: Logger use during operation
    @inlinable
    public func createCluster(
        addressId: String,
        description: String? = nil,
        forceCreateJobs: Bool? = nil,
        forwardingAddressId: String? = nil,
        initialClusterSize: Int? = nil,
        jobType: JobType,
        kmsKeyARN: String? = nil,
        longTermPricingIds: [String]? = nil,
        notification: Notification? = nil,
        onDeviceServiceConfiguration: OnDeviceServiceConfiguration? = nil,
        remoteManagement: RemoteManagement? = nil,
        resources: JobResource? = nil,
        roleARN: String? = nil,
        shippingOption: ShippingOption,
        snowballCapacityPreference: SnowballCapacity? = nil,
        snowballType: SnowballType,
        taxDocuments: TaxDocuments? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateClusterResult {
        let input = CreateClusterRequest(
            addressId: addressId, 
            description: description, 
            forceCreateJobs: forceCreateJobs, 
            forwardingAddressId: forwardingAddressId, 
            initialClusterSize: initialClusterSize, 
            jobType: jobType, 
            kmsKeyARN: kmsKeyARN, 
            longTermPricingIds: longTermPricingIds, 
            notification: notification, 
            onDeviceServiceConfiguration: onDeviceServiceConfiguration, 
            remoteManagement: remoteManagement, 
            resources: resources, 
            roleARN: roleARN, 
            shippingOption: shippingOption, 
            snowballCapacityPreference: snowballCapacityPreference, 
            snowballType: snowballType, 
            taxDocuments: taxDocuments
        )
        return try await self.createCluster(input, logger: logger)
    }

    /// Creates a job to import or export data between Amazon S3 and your on-premises data center. Your Amazon Web Services account must have the right trust policies and permissions in place to create a job for a Snow device. If you're creating a job for a node in a cluster, you only need to provide the clusterId value; the other job attributes are inherited from the cluster.   Only the Snowball; Edge device type is supported when ordering clustered jobs. The device capacity is optional. Availability of device types differ by Amazon Web Services Region. For more information about Region availability, see Amazon Web Services Regional Services.    Snow Family devices and their capacities.    Device type: SNC1_SSD    Capacity: T14   Description: Snowcone       Device type: SNC1_HDD    Capacity: T8   Description: Snowcone       Device type: EDGE_S    Capacity: T98   Description: Snowball Edge Storage Optimized for data transfer only       Device type: EDGE_CG    Capacity: T42   Description: Snowball Edge Compute Optimized with GPU      Device type: EDGE_C    Capacity: T42   Description: Snowball Edge Compute Optimized without GPU      Device type: EDGE    Capacity: T100   Description: Snowball Edge Storage Optimized with EC2 Compute    This device is replaced with T98.     Device type: STANDARD    Capacity: T50   Description: Original Snowball device  This device is only available in the Ningxia, Beijing, and Singapore Amazon Web Services Region        Device type: STANDARD    Capacity: T80   Description: Original Snowball device  This device is only available in the Ningxia, Beijing, and Singapore Amazon Web Services Region.        Snow Family device type: RACK_5U_C    Capacity: T13    Description: Snowblade.     Device type: V3_5S    Capacity: T240   Description: Snowball Edge Storage Optimized 210TB
    @Sendable
    @inlinable
    public func createJob(_ input: CreateJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateJobResult {
        try await self.client.execute(
            operation: "CreateJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a job to import or export data between Amazon S3 and your on-premises data center. Your Amazon Web Services account must have the right trust policies and permissions in place to create a job for a Snow device. If you're creating a job for a node in a cluster, you only need to provide the clusterId value; the other job attributes are inherited from the cluster.   Only the Snowball; Edge device type is supported when ordering clustered jobs. The device capacity is optional. Availability of device types differ by Amazon Web Services Region. For more information about Region availability, see Amazon Web Services Regional Services.    Snow Family devices and their capacities.    Device type: SNC1_SSD    Capacity: T14   Description: Snowcone       Device type: SNC1_HDD    Capacity: T8   Description: Snowcone       Device type: EDGE_S    Capacity: T98   Description: Snowball Edge Storage Optimized for data transfer only       Device type: EDGE_CG    Capacity: T42   Description: Snowball Edge Compute Optimized with GPU      Device type: EDGE_C    Capacity: T42   Description: Snowball Edge Compute Optimized without GPU      Device type: EDGE    Capacity: T100   Description: Snowball Edge Storage Optimized with EC2 Compute    This device is replaced with T98.     Device type: STANDARD    Capacity: T50   Description: Original Snowball device  This device is only available in the Ningxia, Beijing, and Singapore Amazon Web Services Region        Device type: STANDARD    Capacity: T80   Description: Original Snowball device  This device is only available in the Ningxia, Beijing, and Singapore Amazon Web Services Region.        Snow Family device type: RACK_5U_C    Capacity: T13    Description: Snowblade.     Device type: V3_5S    Capacity: T240   Description: Snowball Edge Storage Optimized 210TB
    ///
    /// Parameters:
    ///   - addressId: The ID for the address that you want the Snow device shipped to.
    ///   - clusterId: The ID of a cluster. If you're creating a job for a node in a cluster, you need to provide only this clusterId value. The other job attributes are inherited from the cluster.
    ///   - description: Defines an optional description of this specific job, for example Important Photos 2016-08-11.
    ///   - deviceConfiguration: Defines the device configuration for an Snowball Edge job. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - forwardingAddressId: The forwarding address ID for a job. This field is not supported in most Regions.
    ///   - impactLevel: The highest impact level of data that will be stored or processed on the device, provided at job creation.
    ///   - jobType: Defines the type of job that you're creating.
    ///   - kmsKeyARN: The KmsKeyARN that you want to associate with this job. KmsKeyARNs are created using the CreateKey Key Management Service (KMS) API action.
    ///   - longTermPricingId: The ID of the long-term pricing type for the device.
    ///   - notification: Defines the Amazon Simple Notification Service (Amazon SNS) notification settings for this job.
    ///   - onDeviceServiceConfiguration: Specifies the service or services on the Snow Family device that your transferred data will be exported from or imported into. Amazon Web Services Snow Family supports Amazon S3 and NFS (Network File System) and the Amazon Web Services Storage Gateway service Tape Gateway type.
    ///   - pickupDetails: Information identifying the person picking up the device.
    ///   - remoteManagement: Allows you to securely operate and manage Snowcone devices remotely from outside of your internal network. When set to INSTALLED_AUTOSTART, remote management will automatically be available when the device arrives at your location. Otherwise, you need to use the Snowball Edge client to manage the device. When set to NOT_INSTALLED, remote management will not be available on the device.
    ///   - resources: Defines the Amazon S3 buckets associated with this job. With IMPORT jobs, you specify the bucket or buckets that your transferred data will be imported into. With EXPORT jobs, you specify the bucket or buckets that your transferred data will be exported from. Optionally, you can also specify a KeyRange value. If you choose to export a range, you define the length of the range by providing either an inclusive BeginMarker value, an inclusive EndMarker value, or both. Ranges are UTF-8 binary sorted.
    ///   - roleARN: The RoleARN that you want to associate with this job. RoleArns are created using the CreateRole Identity and Access Management (IAM) API action.
    ///   - shippingOption: The shipping speed for this job. This speed doesn't dictate how soon you'll get the Snow device, rather it represents how quickly the Snow device moves to its destination while in transit. Regional shipping speeds are as follows:   In Australia, you have access to express shipping. Typically, Snow devices shipped express are delivered in about a day.   In the European Union (EU), you have access to express shipping. Typically, Snow devices shipped express are delivered in about a day. In addition, most countries in the EU have access to standard shipping, which typically takes less than a week, one way.   In India, Snow devices are delivered in one to seven days.   In the US, you have access to one-day shipping and two-day shipping.
    ///   - snowballCapacityPreference: If your job is being created in one of the US regions, you have the option of specifying what size Snow device you'd like for this job. In all other regions, Snowballs come with 80 TB in storage capacity. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - snowballType: The type of Snow Family devices to use for this job.   For cluster jobs, Amazon Web Services Snow Family currently supports only the EDGE device type.  The type of Amazon Web Services Snow device to use for this job. Currently, the only supported device type for cluster jobs is EDGE. For more information, see Snowball Edge Device Options in the Snowball Edge Developer Guide. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - taxDocuments: The tax documents required in your Amazon Web Services Region.
    ///   - logger: Logger use during operation
    @inlinable
    public func createJob(
        addressId: String? = nil,
        clusterId: String? = nil,
        description: String? = nil,
        deviceConfiguration: DeviceConfiguration? = nil,
        forwardingAddressId: String? = nil,
        impactLevel: ImpactLevel? = nil,
        jobType: JobType? = nil,
        kmsKeyARN: String? = nil,
        longTermPricingId: String? = nil,
        notification: Notification? = nil,
        onDeviceServiceConfiguration: OnDeviceServiceConfiguration? = nil,
        pickupDetails: PickupDetails? = nil,
        remoteManagement: RemoteManagement? = nil,
        resources: JobResource? = nil,
        roleARN: String? = nil,
        shippingOption: ShippingOption? = nil,
        snowballCapacityPreference: SnowballCapacity? = nil,
        snowballType: SnowballType? = nil,
        taxDocuments: TaxDocuments? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateJobResult {
        let input = CreateJobRequest(
            addressId: addressId, 
            clusterId: clusterId, 
            description: description, 
            deviceConfiguration: deviceConfiguration, 
            forwardingAddressId: forwardingAddressId, 
            impactLevel: impactLevel, 
            jobType: jobType, 
            kmsKeyARN: kmsKeyARN, 
            longTermPricingId: longTermPricingId, 
            notification: notification, 
            onDeviceServiceConfiguration: onDeviceServiceConfiguration, 
            pickupDetails: pickupDetails, 
            remoteManagement: remoteManagement, 
            resources: resources, 
            roleARN: roleARN, 
            shippingOption: shippingOption, 
            snowballCapacityPreference: snowballCapacityPreference, 
            snowballType: snowballType, 
            taxDocuments: taxDocuments
        )
        return try await self.createJob(input, logger: logger)
    }

    /// Creates a job with the long-term usage option for a device. The long-term usage is a 1-year or 3-year long-term pricing type for the device. You are billed upfront, and Amazon Web Services provides discounts for long-term pricing.
    @Sendable
    @inlinable
    public func createLongTermPricing(_ input: CreateLongTermPricingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateLongTermPricingResult {
        try await self.client.execute(
            operation: "CreateLongTermPricing", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a job with the long-term usage option for a device. The long-term usage is a 1-year or 3-year long-term pricing type for the device. You are billed upfront, and Amazon Web Services provides discounts for long-term pricing.
    ///
    /// Parameters:
    ///   - isLongTermPricingAutoRenew: Specifies whether the current long-term pricing type for the device should be renewed.
    ///   - longTermPricingType: The type of long-term pricing option you want for the device, either 1-year or 3-year long-term pricing.
    ///   - snowballType: The type of Snow Family devices to use for the long-term pricing job.
    ///   - logger: Logger use during operation
    @inlinable
    public func createLongTermPricing(
        isLongTermPricingAutoRenew: Bool? = nil,
        longTermPricingType: LongTermPricingType,
        snowballType: SnowballType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateLongTermPricingResult {
        let input = CreateLongTermPricingRequest(
            isLongTermPricingAutoRenew: isLongTermPricingAutoRenew, 
            longTermPricingType: longTermPricingType, 
            snowballType: snowballType
        )
        return try await self.createLongTermPricing(input, logger: logger)
    }

    /// Creates a shipping label that will be used to return the Snow device to Amazon Web Services.
    @Sendable
    @inlinable
    public func createReturnShippingLabel(_ input: CreateReturnShippingLabelRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateReturnShippingLabelResult {
        try await self.client.execute(
            operation: "CreateReturnShippingLabel", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a shipping label that will be used to return the Snow device to Amazon Web Services.
    ///
    /// Parameters:
    ///   - jobId: The ID for a job that you want to create the return shipping label for; for example, JID123e4567-e89b-12d3-a456-426655440000.
    ///   - shippingOption: The shipping speed for a particular job. This speed doesn't dictate how soon the device is returned to Amazon Web Services. This speed represents how quickly it moves to its destination while in transit. Regional shipping speeds are as follows:
    ///   - logger: Logger use during operation
    @inlinable
    public func createReturnShippingLabel(
        jobId: String,
        shippingOption: ShippingOption? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateReturnShippingLabelResult {
        let input = CreateReturnShippingLabelRequest(
            jobId: jobId, 
            shippingOption: shippingOption
        )
        return try await self.createReturnShippingLabel(input, logger: logger)
    }

    /// Takes an AddressId and returns specific details about that address in the form of an Address object.
    @Sendable
    @inlinable
    public func describeAddress(_ input: DescribeAddressRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAddressResult {
        try await self.client.execute(
            operation: "DescribeAddress", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Takes an AddressId and returns specific details about that address in the form of an Address object.
    ///
    /// Parameters:
    ///   - addressId: The automatically generated ID for a specific address.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAddress(
        addressId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAddressResult {
        let input = DescribeAddressRequest(
            addressId: addressId
        )
        return try await self.describeAddress(input, logger: logger)
    }

    /// Returns a specified number of ADDRESS objects. Calling this API in one of the US regions will return addresses from the list of all addresses associated with this account in all US regions.
    @Sendable
    @inlinable
    public func describeAddresses(_ input: DescribeAddressesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAddressesResult {
        try await self.client.execute(
            operation: "DescribeAddresses", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a specified number of ADDRESS objects. Calling this API in one of the US regions will return addresses from the list of all addresses associated with this account in all US regions.
    ///
    /// Parameters:
    ///   - maxResults: The number of ADDRESS objects to return.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of ADDRESS objects, you have the option of specifying a value for NextToken as the starting point for your list of returned addresses.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAddresses(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAddressesResult {
        let input = DescribeAddressesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.describeAddresses(input, logger: logger)
    }

    /// Returns information about a specific cluster including shipping information, cluster status, and other important metadata.
    @Sendable
    @inlinable
    public func describeCluster(_ input: DescribeClusterRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeClusterResult {
        try await self.client.execute(
            operation: "DescribeCluster", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about a specific cluster including shipping information, cluster status, and other important metadata.
    ///
    /// Parameters:
    ///   - clusterId: The automatically generated ID for a cluster.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeCluster(
        clusterId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeClusterResult {
        let input = DescribeClusterRequest(
            clusterId: clusterId
        )
        return try await self.describeCluster(input, logger: logger)
    }

    /// Returns information about a specific job including shipping information, job status, and other important metadata.
    @Sendable
    @inlinable
    public func describeJob(_ input: DescribeJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeJobResult {
        try await self.client.execute(
            operation: "DescribeJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about a specific job including shipping information, job status, and other important metadata.
    ///
    /// Parameters:
    ///   - jobId: The automatically generated ID for a job, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeJob(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeJobResult {
        let input = DescribeJobRequest(
            jobId: jobId
        )
        return try await self.describeJob(input, logger: logger)
    }

    /// Information on the shipping label of a Snow device that is being returned to Amazon Web Services.
    @Sendable
    @inlinable
    public func describeReturnShippingLabel(_ input: DescribeReturnShippingLabelRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeReturnShippingLabelResult {
        try await self.client.execute(
            operation: "DescribeReturnShippingLabel", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Information on the shipping label of a Snow device that is being returned to Amazon Web Services.
    ///
    /// Parameters:
    ///   - jobId: The automatically generated ID for a job, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeReturnShippingLabel(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeReturnShippingLabelResult {
        let input = DescribeReturnShippingLabelRequest(
            jobId: jobId
        )
        return try await self.describeReturnShippingLabel(input, logger: logger)
    }

    /// Returns a link to an Amazon S3 presigned URL for the manifest file associated with the specified JobId value. You can access the manifest file for up to 60 minutes after this request has been made. To access the manifest file after 60 minutes have passed, you'll have to make another call to the GetJobManifest action. The manifest is an encrypted file that you can download after your job enters the WithCustomer status. This is the only valid status for calling this API as the manifest and UnlockCode code value are used for securing your device and should only be used when you have the device.  The manifest is decrypted by using the UnlockCode code value, when you pass both values to the Snow device through the Snowball client when the client is started for the first time.  As a best practice, we recommend that you don't save a copy of an UnlockCode value in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snow device associated with that job. The credentials of a given job, including its manifest file and unlock code, expire 360 days after the job is created.
    @Sendable
    @inlinable
    public func getJobManifest(_ input: GetJobManifestRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetJobManifestResult {
        try await self.client.execute(
            operation: "GetJobManifest", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a link to an Amazon S3 presigned URL for the manifest file associated with the specified JobId value. You can access the manifest file for up to 60 minutes after this request has been made. To access the manifest file after 60 minutes have passed, you'll have to make another call to the GetJobManifest action. The manifest is an encrypted file that you can download after your job enters the WithCustomer status. This is the only valid status for calling this API as the manifest and UnlockCode code value are used for securing your device and should only be used when you have the device.  The manifest is decrypted by using the UnlockCode code value, when you pass both values to the Snow device through the Snowball client when the client is started for the first time.  As a best practice, we recommend that you don't save a copy of an UnlockCode value in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snow device associated with that job. The credentials of a given job, including its manifest file and unlock code, expire 360 days after the job is created.
    ///
    /// Parameters:
    ///   - jobId: The ID for a job that you want to get the manifest file for, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func getJobManifest(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetJobManifestResult {
        let input = GetJobManifestRequest(
            jobId: jobId
        )
        return try await self.getJobManifest(input, logger: logger)
    }

    /// Returns the UnlockCode code value for the specified job. A particular UnlockCode value can be accessed for up to 360 days after the associated job has been created. The UnlockCode value is a 29-character code with 25 alphanumeric characters and 4 hyphens. This code is used to decrypt the manifest file when it is passed along with the manifest to the Snow device through the Snowball client when the client is started for the first time. The only valid status for calling this API is WithCustomer as the manifest and Unlock code values are used for securing your device and should only be used when you have the device. As a best practice, we recommend that you don't save a copy of the UnlockCode in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snow device associated with that job.
    @Sendable
    @inlinable
    public func getJobUnlockCode(_ input: GetJobUnlockCodeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetJobUnlockCodeResult {
        try await self.client.execute(
            operation: "GetJobUnlockCode", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the UnlockCode code value for the specified job. A particular UnlockCode value can be accessed for up to 360 days after the associated job has been created. The UnlockCode value is a 29-character code with 25 alphanumeric characters and 4 hyphens. This code is used to decrypt the manifest file when it is passed along with the manifest to the Snow device through the Snowball client when the client is started for the first time. The only valid status for calling this API is WithCustomer as the manifest and Unlock code values are used for securing your device and should only be used when you have the device. As a best practice, we recommend that you don't save a copy of the UnlockCode in the same location as the manifest file for that job. Saving these separately helps prevent unauthorized parties from gaining access to the Snow device associated with that job.
    ///
    /// Parameters:
    ///   - jobId: The ID for the job that you want to get the UnlockCode value for, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func getJobUnlockCode(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetJobUnlockCodeResult {
        let input = GetJobUnlockCodeRequest(
            jobId: jobId
        )
        return try await self.getJobUnlockCode(input, logger: logger)
    }

    /// Returns information about the Snow Family service limit for your account, and also the number of Snow devices your account has in use. The default service limit for the number of Snow devices that you can have at one time is 1. If you want to increase your service limit, contact Amazon Web Services Support.
    @Sendable
    @inlinable
    public func getSnowballUsage(_ input: GetSnowballUsageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSnowballUsageResult {
        try await self.client.execute(
            operation: "GetSnowballUsage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns information about the Snow Family service limit for your account, and also the number of Snow devices your account has in use. The default service limit for the number of Snow devices that you can have at one time is 1. If you want to increase your service limit, contact Amazon Web Services Support.
    ///
    /// Parameters:
    ///   - logger: Logger use during operation
    @inlinable
    public func getSnowballUsage(
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSnowballUsageResult {
        let input = GetSnowballUsageRequest(
        )
        return try await self.getSnowballUsage(input, logger: logger)
    }

    /// Returns an Amazon S3 presigned URL for an update file associated with a specified JobId.
    @Sendable
    @inlinable
    public func getSoftwareUpdates(_ input: GetSoftwareUpdatesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetSoftwareUpdatesResult {
        try await self.client.execute(
            operation: "GetSoftwareUpdates", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an Amazon S3 presigned URL for an update file associated with a specified JobId.
    ///
    /// Parameters:
    ///   - jobId: The ID for a job that you want to get the software update file for, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - logger: Logger use during operation
    @inlinable
    public func getSoftwareUpdates(
        jobId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetSoftwareUpdatesResult {
        let input = GetSoftwareUpdatesRequest(
            jobId: jobId
        )
        return try await self.getSoftwareUpdates(input, logger: logger)
    }

    /// Returns an array of JobListEntry objects of the specified length. Each JobListEntry object is for a job in the specified cluster and contains a job's state, a job's ID, and other information.
    @Sendable
    @inlinable
    public func listClusterJobs(_ input: ListClusterJobsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListClusterJobsResult {
        try await self.client.execute(
            operation: "ListClusterJobs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an array of JobListEntry objects of the specified length. Each JobListEntry object is for a job in the specified cluster and contains a job's state, a job's ID, and other information.
    ///
    /// Parameters:
    ///   - clusterId: The 39-character ID for the cluster that you want to list, for example CID123e4567-e89b-12d3-a456-426655440000.
    ///   - maxResults: The number of JobListEntry objects to return.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of JobListEntry objects, you have the option of specifying NextToken as the starting point for your returned list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listClusterJobs(
        clusterId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListClusterJobsResult {
        let input = ListClusterJobsRequest(
            clusterId: clusterId, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listClusterJobs(input, logger: logger)
    }

    /// Returns an array of ClusterListEntry objects of the specified length. Each ClusterListEntry object contains a cluster's state, a cluster's ID, and other important status information.
    @Sendable
    @inlinable
    public func listClusters(_ input: ListClustersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListClustersResult {
        try await self.client.execute(
            operation: "ListClusters", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an array of ClusterListEntry objects of the specified length. Each ClusterListEntry object contains a cluster's state, a cluster's ID, and other important status information.
    ///
    /// Parameters:
    ///   - maxResults: The number of ClusterListEntry objects to return.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of ClusterListEntry objects, you have the option of specifying NextToken as the starting point for your returned list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listClusters(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListClustersResult {
        let input = ListClustersRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listClusters(input, logger: logger)
    }

    /// This action returns a list of the different Amazon EC2-compatible Amazon Machine Images (AMIs) that are owned by your Amazon Web Services accountthat would be supported for use on a Snow device. Currently, supported AMIs are based on the Amazon Linux-2, Ubuntu 20.04 LTS - Focal, or Ubuntu 22.04 LTS - Jammy images, available on the Amazon Web Services Marketplace. Ubuntu 16.04 LTS - Xenial (HVM) images are no longer supported in the Market, but still supported for use on devices through Amazon EC2 VM Import/Export and running locally in AMIs.
    @Sendable
    @inlinable
    public func listCompatibleImages(_ input: ListCompatibleImagesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListCompatibleImagesResult {
        try await self.client.execute(
            operation: "ListCompatibleImages", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// This action returns a list of the different Amazon EC2-compatible Amazon Machine Images (AMIs) that are owned by your Amazon Web Services accountthat would be supported for use on a Snow device. Currently, supported AMIs are based on the Amazon Linux-2, Ubuntu 20.04 LTS - Focal, or Ubuntu 22.04 LTS - Jammy images, available on the Amazon Web Services Marketplace. Ubuntu 16.04 LTS - Xenial (HVM) images are no longer supported in the Market, but still supported for use on devices through Amazon EC2 VM Import/Export and running locally in AMIs.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results for the list of compatible images. Currently, a Snowball Edge device can store 10 AMIs.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of compatible images, you can specify a value for NextToken as the starting point for your list of returned images.
    ///   - logger: Logger use during operation
    @inlinable
    public func listCompatibleImages(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListCompatibleImagesResult {
        let input = ListCompatibleImagesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listCompatibleImages(input, logger: logger)
    }

    /// Returns an array of JobListEntry objects of the specified length. Each JobListEntry object contains a job's state, a job's ID, and a value that indicates whether the job is a job part, in the case of export jobs. Calling this API action in one of the US regions will return jobs from the list of all jobs associated with this account in all US regions.
    @Sendable
    @inlinable
    public func listJobs(_ input: ListJobsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListJobsResult {
        try await self.client.execute(
            operation: "ListJobs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an array of JobListEntry objects of the specified length. Each JobListEntry object contains a job's state, a job's ID, and a value that indicates whether the job is a job part, in the case of export jobs. Calling this API action in one of the US regions will return jobs from the list of all jobs associated with this account in all US regions.
    ///
    /// Parameters:
    ///   - maxResults: The number of JobListEntry objects to return.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of JobListEntry objects, you have the option of specifying NextToken as the starting point for your returned list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listJobs(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListJobsResult {
        let input = ListJobsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listJobs(input, logger: logger)
    }

    /// Lists all long-term pricing types.
    @Sendable
    @inlinable
    public func listLongTermPricing(_ input: ListLongTermPricingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListLongTermPricingResult {
        try await self.client.execute(
            operation: "ListLongTermPricing", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all long-term pricing types.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of ListLongTermPricing objects to return.
    ///   - nextToken: Because HTTP requests are stateless, this is the starting point for your next list of ListLongTermPricing to return.
    ///   - logger: Logger use during operation
    @inlinable
    public func listLongTermPricing(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListLongTermPricingResult {
        let input = ListLongTermPricingRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listLongTermPricing(input, logger: logger)
    }

    /// A list of locations from which the customer can choose to pickup a device.
    @Sendable
    @inlinable
    public func listPickupLocations(_ input: ListPickupLocationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPickupLocationsResult {
        try await self.client.execute(
            operation: "ListPickupLocations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// A list of locations from which the customer can choose to pickup a device.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of locations to list per page.
    ///   - nextToken: HTTP requests are stateless. To identify what object comes "next" in the list of ListPickupLocationsRequest objects, you have the option of specifying NextToken as the starting point for your returned list.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPickupLocations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPickupLocationsResult {
        let input = ListPickupLocationsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listPickupLocations(input, logger: logger)
    }

    /// Lists all supported versions for Snow on-device services. Returns an array of ServiceVersion object containing the supported versions for a particular service.
    @Sendable
    @inlinable
    public func listServiceVersions(_ input: ListServiceVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListServiceVersionsResult {
        try await self.client.execute(
            operation: "ListServiceVersions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all supported versions for Snow on-device services. Returns an array of ServiceVersion object containing the supported versions for a particular service.
    ///
    /// Parameters:
    ///   - dependentServices: A list of names and versions of dependant services of the requested service.
    ///   - maxResults: The maximum number of ListServiceVersions objects to return.
    ///   - nextToken: Because HTTP requests are stateless, this is the starting point for the next list of returned  ListServiceVersionsRequest versions.
    ///   - serviceName: The name of the service for which you're requesting supported versions.
    ///   - logger: Logger use during operation
    @inlinable
    public func listServiceVersions(
        dependentServices: [DependentService]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        serviceName: ServiceName,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListServiceVersionsResult {
        let input = ListServiceVersionsRequest(
            dependentServices: dependentServices, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            serviceName: serviceName
        )
        return try await self.listServiceVersions(input, logger: logger)
    }

    /// While a cluster's ClusterState value is in the AwaitingQuorum state, you can update some of the information associated with a cluster. Once the cluster changes to a different job state, usually 60 minutes after the cluster being created, this action is no longer available.
    @Sendable
    @inlinable
    public func updateCluster(_ input: UpdateClusterRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateClusterResult {
        try await self.client.execute(
            operation: "UpdateCluster", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// While a cluster's ClusterState value is in the AwaitingQuorum state, you can update some of the information associated with a cluster. Once the cluster changes to a different job state, usually 60 minutes after the cluster being created, this action is no longer available.
    ///
    /// Parameters:
    ///   - addressId: The ID of the updated Address object.
    ///   - clusterId: The cluster ID of the cluster that you want to update, for example CID123e4567-e89b-12d3-a456-426655440000.
    ///   - description: The updated description of this cluster.
    ///   - forwardingAddressId: The updated ID for the forwarding address for a cluster. This field is not supported in most regions.
    ///   - notification: The new or updated Notification object.
    ///   - onDeviceServiceConfiguration: Specifies the service or services on the Snow Family device that your transferred data will be exported from or imported into. Amazon Web Services Snow Family device clusters support Amazon S3 and NFS (Network File System).
    ///   - resources: The updated arrays of JobResource objects that can include updated S3Resource objects or LambdaResource objects.
    ///   - roleARN: The new role Amazon Resource Name (ARN) that you want to associate with this cluster. To create a role ARN, use the CreateRole API action in Identity and Access Management (IAM).
    ///   - shippingOption: The updated shipping option value of this cluster's ShippingDetails object.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateCluster(
        addressId: String? = nil,
        clusterId: String,
        description: String? = nil,
        forwardingAddressId: String? = nil,
        notification: Notification? = nil,
        onDeviceServiceConfiguration: OnDeviceServiceConfiguration? = nil,
        resources: JobResource? = nil,
        roleARN: String? = nil,
        shippingOption: ShippingOption? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateClusterResult {
        let input = UpdateClusterRequest(
            addressId: addressId, 
            clusterId: clusterId, 
            description: description, 
            forwardingAddressId: forwardingAddressId, 
            notification: notification, 
            onDeviceServiceConfiguration: onDeviceServiceConfiguration, 
            resources: resources, 
            roleARN: roleARN, 
            shippingOption: shippingOption
        )
        return try await self.updateCluster(input, logger: logger)
    }

    /// While a job's JobState value is New, you can update some of the information associated with a job. Once the job changes to a different job state, usually within 60 minutes of the job being created, this action is no longer available.
    @Sendable
    @inlinable
    public func updateJob(_ input: UpdateJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateJobResult {
        try await self.client.execute(
            operation: "UpdateJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// While a job's JobState value is New, you can update some of the information associated with a job. Once the job changes to a different job state, usually within 60 minutes of the job being created, this action is no longer available.
    ///
    /// Parameters:
    ///   - addressId: The ID of the updated Address object.
    ///   - description: The updated description of this job's JobMetadata object.
    ///   - forwardingAddressId: The updated ID for the forwarding address for a job. This field is not supported in most regions.
    ///   - jobId: The job ID of the job that you want to update, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - notification: The new or updated Notification object.
    ///   - onDeviceServiceConfiguration: Specifies the service or services on the Snow Family device that your transferred data will be exported from or imported into. Amazon Web Services Snow Family supports Amazon S3 and NFS (Network File System) and the Amazon Web Services Storage Gateway service Tape Gateway type.
    ///   - pickupDetails: 
    ///   - resources: The updated JobResource object, or the updated JobResource object.
    ///   - roleARN: The new role Amazon Resource Name (ARN) that you want to associate with this job. To create a role ARN, use the CreateRoleIdentity and Access Management (IAM) API action.
    ///   - shippingOption: The updated shipping option value of this job's ShippingDetails object.
    ///   - snowballCapacityPreference: The updated SnowballCapacityPreference of this job's JobMetadata object. The 50 TB Snowballs are only available in the US regions. For more information, see "https://docs.aws.amazon.com/snowball/latest/snowcone-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide or "https://docs.aws.amazon.com/snowball/latest/developer-guide/snow-device-types.html" (Snow Family Devices and Capacity) in the Snowcone User Guide.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateJob(
        addressId: String? = nil,
        description: String? = nil,
        forwardingAddressId: String? = nil,
        jobId: String,
        notification: Notification? = nil,
        onDeviceServiceConfiguration: OnDeviceServiceConfiguration? = nil,
        pickupDetails: PickupDetails? = nil,
        resources: JobResource? = nil,
        roleARN: String? = nil,
        shippingOption: ShippingOption? = nil,
        snowballCapacityPreference: SnowballCapacity? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateJobResult {
        let input = UpdateJobRequest(
            addressId: addressId, 
            description: description, 
            forwardingAddressId: forwardingAddressId, 
            jobId: jobId, 
            notification: notification, 
            onDeviceServiceConfiguration: onDeviceServiceConfiguration, 
            pickupDetails: pickupDetails, 
            resources: resources, 
            roleARN: roleARN, 
            shippingOption: shippingOption, 
            snowballCapacityPreference: snowballCapacityPreference
        )
        return try await self.updateJob(input, logger: logger)
    }

    /// Updates the state when a shipment state changes to a different state.
    @Sendable
    @inlinable
    public func updateJobShipmentState(_ input: UpdateJobShipmentStateRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateJobShipmentStateResult {
        try await self.client.execute(
            operation: "UpdateJobShipmentState", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the state when a shipment state changes to a different state.
    ///
    /// Parameters:
    ///   - jobId: The job ID of the job whose shipment date you want to update, for example JID123e4567-e89b-12d3-a456-426655440000.
    ///   - shipmentState: The state of a device when it is being shipped.  Set to RECEIVED when the device arrives at your location. Set to RETURNED when you have returned the device to Amazon Web Services.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateJobShipmentState(
        jobId: String,
        shipmentState: ShipmentState,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateJobShipmentStateResult {
        let input = UpdateJobShipmentStateRequest(
            jobId: jobId, 
            shipmentState: shipmentState
        )
        return try await self.updateJobShipmentState(input, logger: logger)
    }

    /// Updates the long-term pricing type.
    @Sendable
    @inlinable
    public func updateLongTermPricing(_ input: UpdateLongTermPricingRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateLongTermPricingResult {
        try await self.client.execute(
            operation: "UpdateLongTermPricing", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the long-term pricing type.
    ///
    /// Parameters:
    ///   - isLongTermPricingAutoRenew: If set to true, specifies that the current long-term pricing type for the device should be automatically renewed before the long-term pricing contract expires.
    ///   - longTermPricingId: The ID of the long-term pricing type for the device.
    ///   - replacementJob: Specifies that a device that is ordered with long-term pricing should be replaced with a new device.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateLongTermPricing(
        isLongTermPricingAutoRenew: Bool? = nil,
        longTermPricingId: String,
        replacementJob: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateLongTermPricingResult {
        let input = UpdateLongTermPricingRequest(
            isLongTermPricingAutoRenew: isLongTermPricingAutoRenew, 
            longTermPricingId: longTermPricingId, 
            replacementJob: replacementJob
        )
        return try await self.updateLongTermPricing(input, logger: logger)
    }
}

extension Snowball {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: Snowball, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension Snowball {
    /// Return PaginatorSequence for operation ``describeAddresses(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func describeAddressesPaginator(
        _ input: DescribeAddressesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<DescribeAddressesRequest, DescribeAddressesResult> {
        return .init(
            input: input,
            command: self.describeAddresses,
            inputKey: \DescribeAddressesRequest.nextToken,
            outputKey: \DescribeAddressesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``describeAddresses(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The number of ADDRESS objects to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func describeAddressesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<DescribeAddressesRequest, DescribeAddressesResult> {
        let input = DescribeAddressesRequest(
            maxResults: maxResults
        )
        return self.describeAddressesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listClusterJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listClusterJobsPaginator(
        _ input: ListClusterJobsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListClusterJobsRequest, ListClusterJobsResult> {
        return .init(
            input: input,
            command: self.listClusterJobs,
            inputKey: \ListClusterJobsRequest.nextToken,
            outputKey: \ListClusterJobsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listClusterJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - clusterId: The 39-character ID for the cluster that you want to list, for example CID123e4567-e89b-12d3-a456-426655440000.
    ///   - maxResults: The number of JobListEntry objects to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listClusterJobsPaginator(
        clusterId: String,
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListClusterJobsRequest, ListClusterJobsResult> {
        let input = ListClusterJobsRequest(
            clusterId: clusterId, 
            maxResults: maxResults
        )
        return self.listClusterJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listClusters(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listClustersPaginator(
        _ input: ListClustersRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListClustersRequest, ListClustersResult> {
        return .init(
            input: input,
            command: self.listClusters,
            inputKey: \ListClustersRequest.nextToken,
            outputKey: \ListClustersResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listClusters(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The number of ClusterListEntry objects to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listClustersPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListClustersRequest, ListClustersResult> {
        let input = ListClustersRequest(
            maxResults: maxResults
        )
        return self.listClustersPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listCompatibleImages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listCompatibleImagesPaginator(
        _ input: ListCompatibleImagesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListCompatibleImagesRequest, ListCompatibleImagesResult> {
        return .init(
            input: input,
            command: self.listCompatibleImages,
            inputKey: \ListCompatibleImagesRequest.nextToken,
            outputKey: \ListCompatibleImagesResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listCompatibleImages(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results for the list of compatible images. Currently, a Snowball Edge device can store 10 AMIs.
    ///   - logger: Logger used for logging
    @inlinable
    public func listCompatibleImagesPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListCompatibleImagesRequest, ListCompatibleImagesResult> {
        let input = ListCompatibleImagesRequest(
            maxResults: maxResults
        )
        return self.listCompatibleImagesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listJobsPaginator(
        _ input: ListJobsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListJobsRequest, ListJobsResult> {
        return .init(
            input: input,
            command: self.listJobs,
            inputKey: \ListJobsRequest.nextToken,
            outputKey: \ListJobsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The number of JobListEntry objects to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listJobsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListJobsRequest, ListJobsResult> {
        let input = ListJobsRequest(
            maxResults: maxResults
        )
        return self.listJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listLongTermPricing(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listLongTermPricingPaginator(
        _ input: ListLongTermPricingRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListLongTermPricingRequest, ListLongTermPricingResult> {
        return .init(
            input: input,
            command: self.listLongTermPricing,
            inputKey: \ListLongTermPricingRequest.nextToken,
            outputKey: \ListLongTermPricingResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listLongTermPricing(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of ListLongTermPricing objects to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listLongTermPricingPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListLongTermPricingRequest, ListLongTermPricingResult> {
        let input = ListLongTermPricingRequest(
            maxResults: maxResults
        )
        return self.listLongTermPricingPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPickupLocations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPickupLocationsPaginator(
        _ input: ListPickupLocationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPickupLocationsRequest, ListPickupLocationsResult> {
        return .init(
            input: input,
            command: self.listPickupLocations,
            inputKey: \ListPickupLocationsRequest.nextToken,
            outputKey: \ListPickupLocationsResult.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPickupLocations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of locations to list per page.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPickupLocationsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPickupLocationsRequest, ListPickupLocationsResult> {
        let input = ListPickupLocationsRequest(
            maxResults: maxResults
        )
        return self.listPickupLocationsPaginator(input, logger: logger)
    }
}

extension Snowball.DescribeAddressesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.DescribeAddressesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListClusterJobsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListClusterJobsRequest {
        return .init(
            clusterId: self.clusterId,
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListClustersRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListClustersRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListCompatibleImagesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListCompatibleImagesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListJobsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListJobsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListLongTermPricingRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListLongTermPricingRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension Snowball.ListPickupLocationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> Snowball.ListPickupLocationsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
